﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Cfg;
using MyDataProvider;

namespace ExcelDbAddIn
{
    public partial class FormSelectingDatabase : Form
    {
        SqlConnectionConfig _config = new SqlConnectionConfig();
        public string[] columnsForShow;
        public ColumnsInformation.ColumnsInfo columnsInfo;

        public FormSelectingDatabase()
        {
            InitializeComponent();
        }
        public void SetConfig(SqlConnectionConfig cfg)
        {
            _config.Auth = new MSSQL.Authorization()
            {
                Type = cfg.Auth.Type,
                UserId = cfg.Auth.UserId,
                Password = cfg.Auth.Password
            };
            _config.DataSource = cfg.DataSource;
        }
        public SqlConnectionConfig GetConfig()
        {
            SqlConnectionConfig cfg = new SqlConnectionConfig();
            cfg.Auth = new MSSQL.Authorization()
            {
                Type = _config.Auth.Type,
                UserId = _config.Auth.UserId,
                Password = _config.Auth.Password
            };
            cfg.DataSource = _config.DataSource;
            cfg.Database = _config.Database;
            cfg.Table = _config.Table;
            cfg.Schema = _config.Schema;
            return cfg;
        }
        private void comboBoxDatabases_SelectedIndexChanged(object sender, EventArgs e)
        {
            _config.Database = comboBoxDatabases.SelectedItem.ToString();
            SqlConnectionStringBuilder sqlConnString = MSSQL.GetConnectionString(_config);
            DataTable tableSchema = MSSQL.GetTables(sqlConnString);
            tableSchema.Columns.Remove("TABLE_CATALOG");
            tableSchema.Columns["TABLE_SCHEMA"].ColumnName = "Схема таблицы";
            tableSchema.Columns["TABLE_NAME"].ColumnName = "Название таблицы";
            tableSchema.Columns["TABLE_TYPE"].ColumnName = "Тип таблицы";

            dataGridViewTables.DataSource = tableSchema;

            if (tableSchema == null)
                return;
            labelTables.Enabled = true;
            buttonOK.Enabled = true;
            btnSettingView.Enabled = true;
        }

        private void buttonOK_Click(object sender, EventArgs e)
        {
            _config.Database = comboBoxDatabases.SelectedItem.ToString();
            _config.Schema = dataGridViewTables.SelectedRows[0].Cells["Схема таблицы"].Value.ToString();
            _config.Table = dataGridViewTables.SelectedRows[0].Cells["Название таблицы"].Value.ToString();
            try
            {
                // Не настроили какие отображение столбцов?
                if (columnsForShow == null) 
                {
                    // Значит будем выводить все столбцы.
                    SqlConnectionStringBuilder sqlConnString = MSSQL.GetConnectionString(_config);
                    columnsInfo = MSSQL.GetColumnsSchemaByQueryToSchema(sqlConnString, _config.Database, _config.Schema, _config.Table);
                    columnsForShow = new string[columnsInfo.Count];
                    int i = 0;
                    foreach (var column in columnsInfo)
                    {
                        columnsForShow[i] = column.Name;
                        i++;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        private void FormSelectingDatabase_Load(object sender, EventArgs e)
        {
            try
            {
                // Получили список баз.
                SqlConnectionStringBuilder sqlConnString = MSSQL.GetConnectionString(_config);
                List<string> databases = MSSQL.GetDatabases(sqlConnString);
                // Отобразили в comboBoxDatabases все базы.
                foreach (string db in databases)
                {
                    comboBoxDatabases.Items.Add(db);
                }
                comboBoxDatabases.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                throw ex;
            }
        }

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }

        private void btnSettingView_Click(object sender, EventArgs e)
        {
            // Получили имя схемы и название таблицы.
            string schema = dataGridViewTables.SelectedRows[0].Cells["Схема таблицы"].Value.ToString();
            string table = dataGridViewTables.SelectedRows[0].Cells["Название таблицы"].Value.ToString();
            // Получаем схему таблицы.
            SqlConnectionStringBuilder sqlConnString = MSSQL.GetConnectionString(_config);
            columnsInfo = MSSQL.GetColumnsSchemaByQueryToSchema(sqlConnString, _config.Database, schema, table);
            // Создаем форму "Настройка отображения"
            FormView formView = new FormView();
            // Указываем той форме информацию о столбцах
            formView.columnsInfo = columnsInfo;
            // Показываем форму.
            DialogResult res = formView.ShowDialog();
            if (res != DialogResult.OK)
                return;
            columnsForShow = formView.columnsForShow;
        }
    }
}
